package cn.iocoder.yudao.module.api.infrastructure.user;

import cn.iocoder.yudao.framework.common.biz.permission.enums.RoleCodeEnum;
import cn.iocoder.yudao.module.api.infrastructure.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.api.infrastructure.user.dto.SystemUserCreateReqDTO;
import jakarta.annotation.Nonnull;
import jakarta.annotation.Nullable;
import jakarta.validation.Valid;

import java.util.List;
import java.util.Set;

/**
 * 系统用户接口
 *
 * @author 山野羡民（1032694760@qq.com）
 */
public interface AdminUserApiV2 {

    /**
     * 创建管理员用户
     *
     * @param dto 管理员用户创建请求
     * @return 用户编号
     */
    Long createUser(@Valid SystemUserCreateReqDTO dto);

    /**
     * 根据用户名查询管理员用户
     *
     * @param username 用户名
     * @return 管理员信息
     */
    @Nullable
    AdminUserRespDTO getByUsername(String username);

    /**
     * 基于手机号，精准匹配用户
     *
     * @param mobile 手机号
     * @return 用户信息
     */
    @Nullable
    AdminUserRespDTO getUserByMobile(String mobile);

    /**
     * 获取指定用户拥有的角色编码集合
     *
     * @param userId 用户编号
     * @return 角色编码集合
     */
    Set<String> getRoleCodes(Long userId);

    /**
     * 修改状态
     *
     * @param id     用户编号
     * @param status 状态
     */
    void updateUserStatus(Long id, Integer status);

    /**
     * 根据用户编号，获得用户名
     *
     * @param id 用户编号
     * @return 用户名
     */
    String getUsernameById(Long id);

    /**
     * 根据角色编码，获得用户编号集合
     *
     * @param roleCode 角色编码
     * @return 用户编号集合
     */
    @Nonnull
    List<Long> getUserIdsByRoleCode(RoleCodeEnum roleCode);

    /**
     * 根据用户编号删除
     *
     * @param id 用户编号
     */
    void deleteById(Long id);

}
